package com.servlet; /**
 * @author wzm
 * @create 2023-03-14 11:04
 */

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    //方法 自动执行 调用子类中符合要求的方法  service访问就会执行
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //根据你访问的路径来执行不同的子类中的方法  /login
        //http://localhost:8080/项目名/login
    
        //根据方法名调用方法  使用反射相关操作
        
        //1.获取的当前访问的资源路径 
        String uri = req.getRequestURI();// /javaweb09/user/login
        //2.从路径中截取访问的方法名
        String methodName = uri.substring(uri.lastIndexOf("/") + 1);//最后一个/后的全截取
        System.out.println("methodName = " + methodName);

        //3.反射获取当前执行的子类对象
        Class<? extends BaseServlet> cla = this.getClass();

        //4.使用子类对象执行对相应的方法完成功能
        try {
            //4.1拿到子类中对应的那个方法
            Method method = cla.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);

            method.setAccessible(true);//让非公开的方法也能被执行

            //4.2执行方法
            method.invoke(this,req,resp);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
